iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
0
自我挑戰組

Codewar 進進出出 JS/Ruby系列 第 12

測智商囉~

  • 分享至 

  • xImage
  •  

題目:
(6 級) IQ Test
Bob 準備要做 IQ 測驗,最常出現的問題是找出哪個數字不一樣。
Bob 發現不一樣的數字通常其奇偶數與其他數字不一樣。
幫助 Bob 檢查他的答案,他需要一個程式來幫他找出哪個數字的奇偶數與其他的不一樣,並且回傳那個數字的位置。

請留意你的任務是幫助 Bob 解決真正 IQ 測驗,因此 elementsindexes 應該從 1 開始而非 0

範例:

iq_test("2 4 7 8 10") => 3 
第三個數字為奇數,而其他數字皆為偶數。

iq_test("1 2 1 1") => 2
第二個數字為偶數,而其他數字皆為奇數。

思考方式:

  1. 先算出每個數字是否為奇數 (得到 true/false 陣列)
  2. 計算 true/false 何者只出現一次
  3. 找出那個數字的 index 並加上 1

Ruby 解法:

def iq_test(numbers)
  # 變數 diff 存放 true/false 陣列
  # 先把參數 numbers 轉成陣列,然後用 map method 依序比對
  diff = numbers.split(" ").map { |n|
    # 把每個 element 轉成 integer 再判斷是否為奇數
    n.to_i.odd?
  }
	
  # 如果奇數只有一個
  if diff.count(true) == 1
    # 就回傳該奇數位置的 index + 1
    diff.index(true) + 1
  else
    # 反之則回傳偶數位置的 index + 1
    diff.index(false) + 1
  end
end

JavaScript 解法:

function iqTest(numbers){
  // 變數 diff 存放 true/false 陣列
  // 先把參數 numbers 轉成陣列,然後用 map function 依序比對
  let diff = numbers.split(" ").map(n => {
    // 把每個 element 轉成 integer 再判斷是否為奇數
    return parseInt(n) % 2 === 0;
  });
  
  // countTrue 變數存放計算結果
  let countTrue = 0;
  // 把 true/false 陣列的每個 element 拿出來比對
  diff.map(bool => {
    // 如果是 ture (奇數)
    if (bool) {
      // countTrue 就加 1
      countTrue++;
    }
  });
  
  // 如果奇數只有一個
  if (countTrue === 1) {
    // 就回傳該奇數位置的 index + 1
    return diff.indexOf(true) + 1
  } else {
    // 反之則回傳偶數位置的 index + 1
    return diff.indexOf(false) + 1
  }
}

上一篇
我全都要
下一篇
羅馬數字
系列文
Codewar 進進出出 JS/Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言